package org.visionlibrary.image.filters.binarization;
//package kar.image.processor.binarization;
//
//import java.awt.image.BufferedImage;
//
//import kar.image.Image;
//import kar.image.histogram.Histogram;
//import kar.image.processor.ImageProcessor;
//import kar.thread.utils.ForOperation;
//import kar.thread.utils.ImageMultiThreadFor;
//
//public class OtsuBinarizationProcessor implements ImageProcessor{
//
//
//	public Image process(final Image img) {
//		final Image resultImg = img.cloneEmpty();
//		
//		final int threshold = calulateThreshold(img);
//		
//		//System.exit(1);
//		
//		ImageMultiThreadFor.getInstance().forImage(img, new ForOperation(){
//			public void doInFor(int x, int y, BufferedImage image) {
//				int color = ( img.getRGB(x, y) & 0xff ) < threshold ? 0x0 : 0xffffff;
//				resultImg.setRGB(x, y, color);
//			}
//		});
//
//		return resultImg;
//	}
//
//	private int calulateThreshold(Image img) {
//		
//		Histogram histogram = new Histogram(img);
//		int[] hist = histogram.getHistogram();
//		
//		//histogram normalization
//		double n = (img.getWidth()+1)*(img.getHeight()+1);
//		
//		double[] h = new double[hist.length];
//		for (int i = 0; i < h.length; i++) {
//			h[i] = ((double)hist[i])/n;
//		}
//
//		double max = Double.MIN_VALUE;
//		int maxI = -1;
//		
//		for (int i = 10; i < h.length-10; i++) {
//			double temp = maxFunc( ((double) i), h );
//			//System.out.println("Temp: "+temp);
//			if( temp > max ){
//				max = temp;
//				maxI = i;
//			}
//			
//		}
//		System.out.println("maxI: "+maxI);
//		
//		return 110;
//	}
//
//	private double maxFunc(double k, double[] h){
//		double omk = omk(k,h);
//		
//		double mik = mik(k,h);
//		
//		double mit = mik(255, h);
//		
//		
//		return Math.pow(((mit*omk)-mik), 2)/(omk*(1-omk));
//	}
//	
//
//	public double omk( double k, double[] h ){
//		double omk = 0;
//		for (int i = 0; i < k; i++) {
//			omk += h[i];
//		}
//		return omk;
//	}
//
//	public double mik( double k, double[] h ){
//		double mik = 0;
//		for (int i = 0; i < k; i++) {
//			mik += ((double) i + 1.0)*h[i];
//		}
//		return mik;
//	}
//}
